package cn.com.egova.skinapplication.skin.attr;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import cn.com.egova.skinapplication.skin.config.Constant;

/**
 * Created by yuanchao on 2017/3/12.
 */

public class SkinAttrSupport {
    /**
     * 根据attrs获取所有需要进行换肤的属性集合.
     * @param attrs
     * @param context
     * @return
     */
    public static List<SkinAttr> getSkinAttrs(AttributeSet attrs, Context context){
        List<SkinAttr> mSkinAttrs = new ArrayList<SkinAttr>();
        SkinAttr skinAttr = null;
        SkinAttrType attrType = null;
        for(int i=0,n=attrs.getAttributeCount();i<n;i++){
            String attrName = attrs.getAttributeName(i);
            String attrValue = attrs.getAttributeValue(i);
            Log.i("TAG",attrName+"="+attrValue);

            if(attrValue.startsWith("@")){  //表示的确引用了资源(如:textColor=@17170444),我们应获取该资源的资源id(17170444)
                //下面这一段的代码之所以要try--catch是因为拿到的attrValue有可能是@style/xxxstyle 这种属性,
                // 而这种属性对应的@xxxxxx是不能转为int类型的,由此可见本框架的1个小缺陷,对于需要换肤的属性,不能写到style样式里.
                int id=-1;
                try {
                    id = Integer.parseInt(attrValue.substring(1));
                } catch (NumberFormatException e) {

                }
                if(id==-1){
                    continue;
                }

                String resName = context.getResources().getResourceEntryName(id); //skin_mm
                if(resName.startsWith(Constant.SKIN_PREFIX)){
                    attrType = getSupportAttrType(attrName);
                    if(attrType==null){
                        continue;
                    }else{
                        skinAttr = new SkinAttr(resName,attrType);
                        mSkinAttrs.add(skinAttr);
                    }
                }
            }
        }
        return mSkinAttrs;
    }


    /**
     * 根据属性名称(如background,textColor之类)获取对应的SkinAttrType.
     * 如果我们不支持这种属性则返回null.
     * @param attrName
     * @return
     */
    private static SkinAttrType getSupportAttrType(String attrName) {
        for(SkinAttrType attrType:SkinAttrType.values()){
            if(attrType.getResType().equals(attrName)){
                return attrType;
            }
        }
        return null;
    }
}
